package org.eliza.base.basicx.controlflowx


private fun basic() {
    var sss = "abcdefg"
//    for 循环可以对任何提供迭代器（iterator）的对象进行遍历
    for (sss1 in sss) {

    }
    sss.forEach { }
    sss.forEachIndexed() { index, sss -> }
    for ((index, c) in sss.withIndex()) {

    }
    for (i in sss.indices) {
//注意这种"在区间上遍历"会编译成优化的实现而不会创建额外对象。
        print(sss[i])
    }
}

/*
while是最基本的循环，它的结构为：
    while( 布尔表达式 ) {
        //循环内容
    }
do…while 循环 对于 while 语句而言，如果不满足条件，则不能进入循环。但有时候我们需要即使不满足条件，也至少执行一次。
do…while 循环和 while 循环相似，不同的是，do…while 循环至少会执行一次。
do {
       //代码语句
}while(布尔表达式);
    */

/*
*
* 返回和跳转
    Kotlin 有三种结构化跳转表达式：
    return。默认从最直接包围它的函数或者匿名函数返回。
    break。终止最直接包围它的循环。
    continue。继续下一次最直接包围它的循环。
    在循环中 Kotlin 支持传统的 break 和 continue 操作符。
* */
private fun whilex() {
    while (kotlin.random.Random(1).nextInt() > 0) {
        return
    }
    do {
//        do…while 循环至少会执行一次。
    } while (kotlin.random.Random(1).nextInt() > 0)
}

private fun loop() {
    // 添加标签
    loopLabel@ for (i in 1..2) {
        for (j in 1..3) {
            if (i < 2) continue@loopLabel
            if (j > 2) break@loopLabel
//            标签限制的 break 跳转到刚好位于该标签指定的循环后面的执行点 。 continue 继续标签指定的循环的下一次迭代 。

            println("$i $j")
        }
    }
}

private fun loopReturn() {
    println("======loopReturn======")
    var ss = fun() {
        var ints = arrayOf(1, 2, 3, 4)
        ints.forEach {
            if (it > 4) return //返回整个函数
            println("$it ")
            if (it > 2) return@forEach //返回forEach函数
        }
        println("end!!")
    }
    var aa = fun() {
        var ints = arrayOf(1, 2, 3, 4)
        ints.forEach outFor@{
            ints.forEach innerFor@{
                if (it > 2) return@innerFor //指定
            }
        }
        println("end!!")
    }
    ss()
}

private fun loopReturnFun() {
    println("======loopReturnFun======")
    var ss = fun(): Int {
        var ints = arrayOf(1, 2, 3, 4)
        ints.forEach inn@{
//            解析器优先选用标签限制的 return
            if (it > 2) return@inn //1  //The integer literal does not conform to the expected type Unit
        }
        println("end!!")
        return 0
    }
    println(ss())
}


private  fun main() {
    loop()
    loopReturn()
    loopReturnFun()

}